﻿// 我的链表.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;
struct Node
{
    int data;
	Node* next;
	Node(int value) :data(value), next(nullptr) {}
};


 class LinkedList {

	
 public: Node* head;

	   LinkedList() :head(nullptr) {}

 //public: LinkedList() : head(nullptr) {}
 public: void insertHead(int value) 
 {

		 Node* newNode = new Node(value);
		 newNode->next = head;
		 head = newNode;

 }



	
 public: void insertTail(int value) 
 {
	 Node* newNode = new Node(value);
	 if (head == nullptr) //判断head释放有数据，没数据直接添加到末尾
	 {
		 head = newNode;
		 return;
	 }
	 Node* tempNode= head;
	 cout << head << endl;
	 cout << tempNode << endl;
	 //这里head也有 10 11的值因为 tempnode 引用 head地址，是head的别名，两个为同意地址，该tempnode就是改 head
	 for (Node* curr = tempNode; curr->next != nullptr; curr = curr->next)
	 {
		 tempNode = curr->next;

	 }
	 tempNode->next = newNode;
 }
 public : void deleteHead(int value) 
{
		  if (head == nullptr) return;
		  if (head->data == value) 
		  {
			  Node* temp = head;
			  head = temp->next;//head->next也可以
			  delete temp;
			  return;
		  }
		  Node* temp = head;
		  while (temp ->next!= nullptr&& temp->next->data != value)
		  {
			  temp = temp->next;
		  }
		  if (temp->next != nullptr) 
		  {
			  Node* toDelete = temp->next;
			  temp->next = toDelete->next;
			  delete toDelete;
		  }
	
	
}
 

 public : void  search(int value) 
{
	 if (head == nullptr) return;
	 if (head->data == value) 
	 {
		 cout << "find value is ==="+ head->data << endl;
		 return;
	 }
	 Node* curr = head;
	 while (curr->next != nullptr) 
	 {	
		 if (curr->next->data == value) 
		 {
			 cout << "find value is ===" << curr->next->data << endl;
			 return;
		 }
		 else 
		 {
			 curr = curr->next;

		 }

	 }
	 cout << "not find value is ===" << value << endl;


}
 public:  void Print()
	 {
		for (Node* curr = head; curr !=nullptr; curr=curr->next)
				cout << curr->data << endl;			
		
	 
	 }

};


int main()
{
	LinkedList linked;
	linked.insertHead(1);
	linked.insertHead(2);
	linked.insertHead(3);
	linked.insertTail(10);
	linked.insertTail(11);
	linked.search(11);
	linked.Print();
	linked.deleteHead(11);
	linked.Print();
	linked.search(11);
	linked.deleteHead(3);
	linked.Print();

    std::cout << "Hello World!\n";
}



// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
